// token_refresh_queue.dart
import 'dart:async';

class TokenRefreshQueue {
  // 单例模式
  TokenRefreshQueue._internal();
  static final TokenRefreshQueue _instance = TokenRefreshQueue._internal();
  static TokenRefreshQueue get instance => _instance;

  bool _isRefreshing = false; // 刷新状态标志[7](@ref)
  final List<Completer<String>> _completers = []; // 等待队列，存储Completer[7](@ref)

  /// 主要的队列方法。当需要刷新时，调用此方法。
  Future<String> queueTokenRefresh(Future<String> Function() refreshCall) async {
    // 如果正在刷新，则将新的Completer加入队列并等待其完成
    if (_isRefreshing) {
      Completer<String> completer = Completer();
      _completers.add(completer);
      return completer.future; // 等待刷新完成后的新token
    }

    // 否则，设置为刷新状态并执行刷新逻辑
    _isRefreshing = true;
    try {
      // 执行实际的刷新GraphQL请求
      final newToken = await refreshCall();
      // 刷新成功，通知所有等待的请求
      _completeAll(newToken);
      return newToken;
    } catch (error) {
      // 刷新失败，传递错误给所有等待的请求
      _completeAllError(error);
      rethrow;
    } finally {
      // 无论成功失败，最终重置状态
      _isRefreshing = false;
      _completers.clear();
    }
  }

  // 私有方法：处理所有等待的请求（成功）
  void _completeAll(String newToken) {
    for (var completer in _completers) {
      if (!completer.isCompleted) {
        completer.complete(newToken);
      }
    }
  }

  // 私有方法：处理所有等待的请求（失败）
  void _completeAllError(Object error) {
    for (var completer in _completers) {
      if (!completer.isCompleted) {
        completer.completeError(error);
      }
    }
  }
}